{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.preprocessing import OneHotEncoder,Binarizer\n",
    "from sklearn.model_selection import train_test_split\n",
    "import numpy as np\n",
    "from sklearn.linear_model import LogisticRegression,LinearRegression\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.metrics import accuracy_score,confusion_matrix,mean_squared_error,recall_score,roc_auc_score,precision_score,f1_score\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "import joblib\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import RocCurveDisplay,ConfusionMatrixDisplay\n",
    "from sklearn import metrics\n",
    "from sklearn.metrics import precision_recall_curve\n",
    "from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer\n",
    "import jieba\n",
    "from sklearn.cluster import KMeans\n",
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.metrics import ConfusionMatrixDisplay"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "      工资  满意度  考核得分  工程数量  月工时  工龄  离职\n0      低  3.8  0.53     2  157   3   1\n1      中  8.0  0.86     5  262   6   1\n2      中  1.1  0.88     7  272   4   1\n3      低  7.2  0.87     5  223   5   1\n4      低  3.7  0.52     2  159   3   1\n...   ..  ...   ...   ...  ...  ..  ..\n14995  高  9.0  0.55     3  259  10   0\n14996  高  7.4  0.95     5  266  10   0\n14997  高  8.5  0.54     3  185  10   0\n14998  高  3.3  0.65     3  172  10   0\n14999  低  5.0  0.73     4  180   3   0\n\n[15000 rows x 7 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>工资</th>\n      <th>满意度</th>\n      <th>考核得分</th>\n      <th>工程数量</th>\n      <th>月工时</th>\n      <th>工龄</th>\n      <th>离职</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>低</td>\n      <td>3.8</td>\n      <td>0.53</td>\n      <td>2</td>\n      <td>157</td>\n      <td>3</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>中</td>\n      <td>8.0</td>\n      <td>0.86</td>\n      <td>5</td>\n      <td>262</td>\n      <td>6</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>中</td>\n      <td>1.1</td>\n      <td>0.88</td>\n      <td>7</td>\n      <td>272</td>\n      <td>4</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>低</td>\n      <td>7.2</td>\n      <td>0.87</td>\n      <td>5</td>\n      <td>223</td>\n      <td>5</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>低</td>\n      <td>3.7</td>\n      <td>0.52</td>\n      <td>2</td>\n      <td>159</td>\n      <td>3</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>14995</th>\n      <td>高</td>\n      <td>9.0</td>\n      <td>0.55</td>\n      <td>3</td>\n      <td>259</td>\n      <td>10</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>14996</th>\n      <td>高</td>\n      <td>7.4</td>\n      <td>0.95</td>\n      <td>5</td>\n      <td>266</td>\n      <td>10</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>14997</th>\n      <td>高</td>\n      <td>8.5</td>\n      <td>0.54</td>\n      <td>3</td>\n      <td>185</td>\n      <td>10</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>14998</th>\n      <td>高</td>\n      <td>3.3</td>\n      <td>0.65</td>\n      <td>3</td>\n      <td>172</td>\n      <td>10</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>14999</th>\n      <td>低</td>\n      <td>5.0</td>\n      <td>0.73</td>\n      <td>4</td>\n      <td>180</td>\n      <td>3</td>\n      <td>0</td>\n    </tr>\n  </tbody>\n</table>\n<p>15000 rows × 7 columns</p>\n</div>"
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_excel(\"C:\\\\Users\\\\Administrator\\\\Desktop\\\\月考练习算法题 (2)\\\\月考练习算法题\\\\大数据-专高六《机器学习》-第5套\\\\专高6月考-05附件\\\\第三题数据\\\\员工离职预测模型.xlsx\")\n",
    "df\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0        0\n1        1\n2        1\n3        0\n4        0\n        ..\n14995    2\n14996    2\n14997    2\n14998    2\n14999    0\nName: 工资, Length: 15000, dtype: int32"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['工资'] = df['工资'].replace({'低': 0, '中': 1, '高': 2})\n",
    "df\n",
    "df[\"工资\"].astype(int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": "       工资  满意度  考核得分  工程数量  月工时  工龄\n0       0  3.8  0.53     2  157   3\n1       1  8.0  0.86     5  262   6\n2       1  1.1  0.88     7  272   4\n3       0  7.2  0.87     5  223   5\n4       0  3.7  0.52     2  159   3\n...    ..  ...   ...   ...  ...  ..\n14995   2  9.0  0.55     3  259  10\n14996   2  7.4  0.95     5  266  10\n14997   2  8.5  0.54     3  185  10\n14998   2  3.3  0.65     3  172  10\n14999   0  5.0  0.73     4  180   3\n\n[15000 rows x 6 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>工资</th>\n      <th>满意度</th>\n      <th>考核得分</th>\n      <th>工程数量</th>\n      <th>月工时</th>\n      <th>工龄</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>0</td>\n      <td>3.8</td>\n      <td>0.53</td>\n      <td>2</td>\n      <td>157</td>\n      <td>3</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>8.0</td>\n      <td>0.86</td>\n      <td>5</td>\n      <td>262</td>\n      <td>6</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>1</td>\n      <td>1.1</td>\n      <td>0.88</td>\n      <td>7</td>\n      <td>272</td>\n      <td>4</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>0</td>\n      <td>7.2</td>\n      <td>0.87</td>\n      <td>5</td>\n      <td>223</td>\n      <td>5</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>0</td>\n      <td>3.7</td>\n      <td>0.52</td>\n      <td>2</td>\n      <td>159</td>\n      <td>3</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>14995</th>\n      <td>2</td>\n      <td>9.0</td>\n      <td>0.55</td>\n      <td>3</td>\n      <td>259</td>\n      <td>10</td>\n    </tr>\n    <tr>\n      <th>14996</th>\n      <td>2</td>\n      <td>7.4</td>\n      <td>0.95</td>\n      <td>5</td>\n      <td>266</td>\n      <td>10</td>\n    </tr>\n    <tr>\n      <th>14997</th>\n      <td>2</td>\n      <td>8.5</td>\n      <td>0.54</td>\n      <td>3</td>\n      <td>185</td>\n      <td>10</td>\n    </tr>\n    <tr>\n      <th>14998</th>\n      <td>2</td>\n      <td>3.3</td>\n      <td>0.65</td>\n      <td>3</td>\n      <td>172</td>\n      <td>10</td>\n    </tr>\n    <tr>\n      <th>14999</th>\n      <td>0</td>\n      <td>5.0</td>\n      <td>0.73</td>\n      <td>4</td>\n      <td>180</td>\n      <td>3</td>\n    </tr>\n  </tbody>\n</table>\n<p>15000 rows × 6 columns</p>\n</div>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "0        1\n1        1\n2        1\n3        1\n4        1\n        ..\n14995    0\n14996    0\n14997    0\n14998    0\n14999    0\nName: 离职, Length: 15000, dtype: int64"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = df.drop(['离职'], axis=1)\n",
    "y = df['离职']\n",
    "display(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr = LogisticRegression()\n",
    "lr.fit(X_train, y_train)\n",
    "y_pred_lr =lr.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "rf = RandomForestClassifier()\n",
    "rf.fit(X_train, y_train)\n",
    "y_pred_rf =rf.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "F:\\python38\\lib\\site-packages\\sklearn\\linear_model\\_logistic.py:460: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n",
      "F:\\python38\\lib\\site-packages\\sklearn\\linear_model\\_logistic.py:460: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n",
      "F:\\python38\\lib\\site-packages\\sklearn\\linear_model\\_logistic.py:460: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n",
      "F:\\python38\\lib\\site-packages\\sklearn\\model_selection\\_validation.py:425: FitFailedWarning: \n",
      "15 fits failed out of a total of 30.\n",
      "The score on these train-test partitions for these parameters will be set to nan.\n",
      "If these failures are not expected, you can try to debug them by setting error_score='raise'.\n",
      "\n",
      "Below are more details about the failures:\n",
      "--------------------------------------------------------------------------------\n",
      "15 fits failed with the following error:\n",
      "Traceback (most recent call last):\n",
      "  File \"F:\\python38\\lib\\site-packages\\sklearn\\model_selection\\_validation.py\", line 729, in _fit_and_score\n",
      "    estimator.fit(X_train, y_train, **fit_params)\n",
      "  File \"F:\\python38\\lib\\site-packages\\sklearn\\base.py\", line 1152, in wrapper\n",
      "    return fit_method(estimator, *args, **kwargs)\n",
      "  File \"F:\\python38\\lib\\site-packages\\sklearn\\linear_model\\_logistic.py\", line 1169, in fit\n",
      "    solver = _check_solver(self.solver, self.penalty, self.dual)\n",
      "  File \"F:\\python38\\lib\\site-packages\\sklearn\\linear_model\\_logistic.py\", line 56, in _check_solver\n",
      "    raise ValueError(\n",
      "ValueError: Solver lbfgs supports only 'l2' or 'none' penalties, got l1 penalty.\n",
      "\n",
      "  warnings.warn(some_fits_failed_message, FitFailedWarning)\n",
      "F:\\python38\\lib\\site-packages\\sklearn\\model_selection\\_search.py:979: UserWarning: One or more of the test scores are non-finite: [       nan 0.77333333        nan 0.7735            nan 0.77533333]\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": "GridSearchCV(cv=5, estimator=LogisticRegression(),\n             param_grid={'C': [0.1, 1, 10], 'penalty': ['l1', 'l2']})",
      "text/html": "<style>#sk-container-id-1 {color: black;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=LogisticRegression(),\n             param_grid={&#x27;C&#x27;: [0.1, 1, 10], &#x27;penalty&#x27;: [&#x27;l1&#x27;, &#x27;l2&#x27;]})</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">GridSearchCV</label><div class=\"sk-toggleable__content\"><pre>GridSearchCV(cv=5, estimator=LogisticRegression(),\n             param_grid={&#x27;C&#x27;: [0.1, 1, 10], &#x27;penalty&#x27;: [&#x27;l1&#x27;, &#x27;l2&#x27;]})</pre></div></div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">estimator: LogisticRegression</label><div class=\"sk-toggleable__content\"><pre>LogisticRegression()</pre></div></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">LogisticRegression</label><div class=\"sk-toggleable__content\"><pre>LogisticRegression()</pre></div></div></div></div></div></div></div></div></div></div>"
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr_params = {\n",
    "    \"C\":[0.1,1,10],\n",
    "    \"penalty\":[\"l1\",\"l2\"],\n",
    "}\n",
    "lr_grid = GridSearchCV(lr, lr_params,cv=5)\n",
    "lr_grid.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": "GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n             param_grid={'max_depth': [2, 5, 10],\n                         'n_estimators': [100, 200, 300]})",
      "text/html": "<style>#sk-container-id-2 {color: black;}#sk-container-id-2 pre{padding: 0;}#sk-container-id-2 div.sk-toggleable {background-color: white;}#sk-container-id-2 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-2 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-2 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-2 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-2 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-2 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-2 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-2 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-2 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-2 div.sk-item {position: relative;z-index: 1;}#sk-container-id-2 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-2 div.sk-item::before, #sk-container-id-2 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-2 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-2 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-2 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-2 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-2 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-2 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-2 div.sk-label-container {text-align: center;}#sk-container-id-2 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-2 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n             param_grid={&#x27;max_depth&#x27;: [2, 5, 10],\n                         &#x27;n_estimators&#x27;: [100, 200, 300]})</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">GridSearchCV</label><div class=\"sk-toggleable__content\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n             param_grid={&#x27;max_depth&#x27;: [2, 5, 10],\n                         &#x27;n_estimators&#x27;: [100, 200, 300]})</pre></div></div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" ><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">estimator: RandomForestClassifier</label><div class=\"sk-toggleable__content\"><pre>RandomForestClassifier()</pre></div></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" ><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomForestClassifier</label><div class=\"sk-toggleable__content\"><pre>RandomForestClassifier()</pre></div></div></div></div></div></div></div></div></div></div>"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rf_params = {\n",
    "    \"n_estimators\":[100,200,300],\n",
    "    \"max_depth\":[2,5,10],\n",
    "}\n",
    "rf_grid = GridSearchCV(rf, rf_params,cv=5)\n",
    "rf_grid.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr_best_mode = lr_grid.best_estimator_\n",
    "rf_best_mode = rf_grid.best_estimator_\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr_pred = lr_best_mode.predict(X_test)\n",
    "rf_pred = rf_best_mode.predict(X_test)\n",
    "\n",
    "lr_acc = accuracy_score(y_test,lr_pred),\n",
    "lr_re = recall_score(y_test, lr_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "rf_acc = accuracy_score(y_test,rf_pred),\n",
    "rf_re = recall_score(y_test, rf_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "逻辑回归特征权重： [[-0.70616793 -0.41268245  0.71459429 -0.29388672  0.00435125  0.22225811]]\n",
      "随机森林特征权重： [0.00560381 0.37824758 0.11294405 0.19358233 0.13297355 0.17664868]\n"
     ]
    }
   ],
   "source": [
    "print(\"逻辑回归特征权重：\", lr_best_mode.coef_)\n",
    "print(\"随机森林特征权重：\", rf_best_mode.feature_importances_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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2Wx88803Z3zvXIVq0aJFNG/evMqygoICnnzySbp27Yqvry8hISEMGTKEpUuXYhhGDb2TM23cuJGePXtit9vp2LEjixYt+tVtDMNg7ty5dO7cGbvdTtu2bZk5c6Zbz/vUU08xc+ZM8vPza/DdnJ0uBa9h65OPcKK0grbN/bgivKXZcUREaoVhGJwsr/s7Fft522rsipqysjJ8fM684KO4uJjXXnuNtWvXnvG9jIwMvv76ax566CFef/11rrjiigt67ePHj3PllVeSn5/PM888wxVXXIGXlxdffvklf/nLXxg0aNAZZagmpKWlcf3113Pffffx7rvvsn79eu6++25CQ0OJi4s753aPPPIIn332GXPnzuXSSy8lLy+PvLw8t563W7dudOjQgXfeeYcHH3ywxt/b/1K5qWGnT0mN7BGG1aqbXImIZzpZ7iQ64cwP/9qWNCOOJj4X9tEVHh7OXXfdxYEDB/jkk0+48cYbz3rUYtWqVdjtdn7zm9+c8b033niDG264gfvvv5/f/OY3PP/88/j5+bmd5YknniA9PZ39+/cTFhZWubxz587ceuut+Pr6uv2c1bFgwQIiIiIqTw9FRUWxefNmXnjhhXOWm+TkZF5++WX27NlDly5dAIiIiLig5x0xYgRLliyp9XJTL05LzZ8/n/DwcHx9fYmNjWXbtm3nXf/DDz+sPIx36aWXsmrVqjpKen55RWVsTDkK6CopEZH6aO7cuXTv3p2dO3cyderUs66zadMmevXqdcZywzB44403uO222+jatSsdO3bko48+cjuDy+ViyZIljBkzpkqxOa1p06Z4eZ29wG3atImmTZue9+vdd98952tv3bqVIUOGVFkWFxfH1q1bz7nNihUriIyM5NNPPyUiIoLw8HDuvvvuKkduqvu8ffr0Ydu2bZSWlp7z9WqC6Udu3n//fSZOnMiCBQuIjY1l3rx5xMXFkZKSQlDQmVcaff3119x6663MmjWLG264gcWLFzNq1Ch27NhBt27dTHgH/7Xy+5+ocBl0axtAp+BmpmYREalNft42kmac+zRGbb7uxRg0aBCPPvroedf54Ycfzlo61q1bR3FxceWRiNtuu43XXnuN22+/3a0Mubm5HDt2jK5du7q1HUDv3r3ZtWvXedcJDg4+5/eys7PP+H5wcDAFBQWcPHnyrEehDh06xA8//MCHH37IW2+9hdPpZMKECdx000188cUXbj1vWFgYZWVlZGdnc8kll1TnLV8Q08vN888/zz333MMdd9wBnDq0tXLlSl5//XUmT558xvovvvgiw4cPZ9KkSQA8/fTTfP7557z00kssWLCgTrP/UuV0CxpILCIezmKxXPDpITP17t37V9c5efLkWU8Lvf7664wePbryqMqtt97KpEmTOHjwIB06dKh2hosZLOzn50fHjh0vePsL4XK5KC0t5a233qJz584AvPbaa/Tq1YuUlJTKU1XVcbrk1PYErKaeliorK2P79u1VDmVZrVaGDBlyzkNk7h5SKy0tpaCgoMpXbUjPLWJHxnGsFojvcWbjFxER8/n7+//qOq1bt+bYsWNVluXl5fHxxx/zj3/8Ay8vL7y8vGjbti0VFRW8/vrrlesFBASc9Wqg48ePExgYCJyaP6l58+bs27fP7fwXe1oqJCSEnJycKstycnIICAg459ih0NBQvLy8KosNnBpTA6cGWLvzvKdPZbVp08aNd+0+U2t3bm4uTqfzrIeyzvU//VyHvrKzs8+6/qxZs5g+fXrNBD6PH/KKadPMTlRoAEHNamcgmIiI1L7LL7+cd955p8qyd999l3bt2vHJJ59UWf7ZZ5/x3HPPMWPGDGw2G126dOGzzz474zl37NhRWQ6sViu33HILb7/9NomJiWecAissLMTX1/es424u9rRU3759zxin+vnnn9O3b99zbtO/f38qKiqqHKHav38/QOWppeo+7549e2jXrh2tW7c+73u4aIaJMjMzDcD4+uuvqyyfNGmS0adPn7Nu4+3tbSxevLjKsvnz5xtBQUFnXb+kpMTIz8+v/Prxxx8NwMjPz6+ZN/E/yiucxpGCkhp/XhERM508edJISkoyTp48aXYUtwwcONB45JFHKh9fcsklxgsvvPCr233//feGl5eXkZeXV7mse/fuxuOPP37GusePHzd8fHyMTz/91DAMwzh48KDh6+trjB8/3vjuu++Mffv2Gc8995zh5eVlrF69unK7n3/+2ejatavRrl0748033zT27t1r7N+/33jttdeMjh07GseOHbvg930+hw4dMpo0aWJMmjTJSE5ONubPn2/YbDZjzZo1lev8/e9/NwYNGlT52Ol0Gj179jQGDBhg7Nixw/j222+N2NhYY+jQoW49r2EYxrhx44w777zznPnO97OWn59f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0ya2bNlC06ZNGT58OGVlZdXOJOKxan3ecRGpc+PGjTNsNpvh7+9f+XXTTTeddd0PP/zQaNWqVeXjN954wwgMDKx83KxZM2PRokVn3fauu+4y/vSnP1VZtmnTJsNqtRonT5486za/fP79+/cbnTt3Nnr37m0YhmGEhYUZM2fOrLLNFVdcYTzwwAOGYRjG+PHjjUGDBhkul+uszw8YH3/8sWEYhpGWlmYAxs6dO6usM27cOGPkyJGVj0eOHGnceeedlY//+c9/GmFhYYbT6TQMwzAGDx5sPPvss1We4+233zZCQ0PPmsEwDCMxMdGwWq2Gv7+/4evrawAGYDz//PPn3MYwDOPBBx80fve7350z6+nX7tKlS5V9UFpaavj5+Rlr16497/OLNAYacyPioa655hpefvnlysf+/v7AqaMYs2bNYt++fRQUFFBRUUFJSQnFxcU0adLkjOeZOHEid999N2+//XblqZUOHToAp05Zff/997z77ruV6xuGgcvlIi0tjaioqLNmy8/Pp2nTprhcLkpKSrjyyit59dVXKSgo4KeffqJ///5V1u/fvz/fffcdcOqU0tChQ+nSpQvDhw/nhhtuYNiwYRe1r8aMGcM999zDP/7xD+x2O++++y633HILVqu18n1u2bKlypEap9N53v0G0KVLF5YvX05JSQnvvPMOu3btYvz48VXWmT9/Pq+//joZGRmcPHmSsrIyevTocd683333HampqTRr1qzK8pKSEg4ePHgBe0DEs6jciHgof39/OnbsWGVZeno6N9xwA/fffz8zZ86kZcuWbN68mbvuuouysrKzfkhPmzaNP/zhD6xcuZLVq1eTmJjIkiVL+O1vf0thYSH33nsvDz/88BnbtW/f/pzZmjVrxo4dO7BarYSGhuLn5wdAQUHBr76vnj17kpaWxurVq1m3bh0333wzQ4YM4aOPPvrVbc9lxIgRGIbBypUrueKKK9i0aRMvvPBC5fcLCwuZPn06N9544xnb+vr6nvN5fXx8Kv8fzJ49m+uvv57p06fz9NNPA7BkyRIee+wxnnvuOfr27UuzZs2YM2cO//73v8+bt7CwkF69elUplafVl0HjImZSuRFpRLZv347L5eK5556rPCpxenzH+XTu3JnOnTszYcIEbr31Vt544w1++9vf0rNnT5KSks4oUb/GarWedZuAgADCwsLYsmULAwcOrFy+ZcsW+vTpU2W90aNHM3r0aG666SaGDx9OXl4eLVu2rPJ8p8e3OJ3O8+bx9fXlxhtv5N133yU1NZUuXbrQs2fPyu/37NmTlJQUt9/nLz311FMMGjSI+++/v/J99uvXjwceeKBynV8eefHx8Tkjf8+ePXn//fcJCgoiICDgojKJeCINKBZpRDp27Eh5eTl///vfOXToEG+//TYLFiw45/onT57koYceYuPGjfzwww9s2bKFb775pvJ00+OPP87XX3/NQw89xK5duzhw4ADLli1ze0Dx/5o0aRJ//etfef/990lJSWHy5Mns2rWLRx55BIDnn3+e9957j3379rF//34+/PBDQkJCznrjwaCgIPz8/FizZg05OTnk5+ef83XHjBnDypUref311ysHEp+WkJDAW2+9xfTp09m7dy/JycksWbKEp556yq331rdvXy677DKeffZZADp16sS3337L2rVr2b9/P1OnTuWbb76psk14eDjff/89KSkp5ObmUl5ezpgxY2jdujUjR45k06ZNpKWlsXHjRh5++GEOHz7sViYRj2T2oB8RqXlnG4R62vPPP2+EhoYafn5+RlxcnPHWW28ZgHHs2DHDMKoO+C0tLTVuueUWw+FwGD4+PkZYWJjx0EMPVRksvG3bNmPo0KFG06ZNDX9/f+Oyyy47Y0Dw//rlgOJfcjqdxrRp04y2bdsa3t7eRvfu3Y3Vq1dXfv+VV14xevToYfj7+xsBAQHG4MGDjR07dlR+n/8ZUGwYhrFw4ULD4XAYVqvVGDhw4Dn3j9PpNEJDQw3AOHjw4Bm51qxZY/Tr18/w8/MzAgICjD59+hivvPLKOd9HYmKi0b179zOWv/fee4bdbjcyMjKMkpIS449//KMRGBhoNG/e3Lj//vuNyZMnV9nuyJEjlfsXMDZs2GAYhmFkZWUZY8eONVq3bm3Y7XYjMjLSuOeee4z8/PxzZhJpLCyGYRjm1isRERGRmqPTUiIiIuJRVG5ERETEo6jciIiIiEdRuRERERGPonIjIiIiHkXlRkRERDyKyo2IiIh4FJUbERER8SgqNyIiIuJRVG5ERETEo6jciIiIiEf5/0u+SbDwbKy8AAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fpr, tpr, thr = metrics.roc_curve(y_test, y_pred_lr)\n",
    "lr_auc = metrics.auc(fpr, tpr)\n",
    "lr_disp = metrics.RocCurveDisplay(fpr=fpr, tpr=tpr, roc_auc=lr_auc,estimator_name='lr')\n",
    "lr_disp.plot()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": "'C:\\\\Users\\\\Administrator\\\\Desktop\\\\pythonProjec\\\\2203APython\\\\月考题\\\\05'"
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rf_pred = rf_best_mode.predict(X_test)\n",
    "rf_pred\n",
    "# 转成df\n",
    "rf_res = pd.DataFrame(rf_pred)\n",
    "# 保存模型\n",
    "rf_res.to_csv(\"xxx.csv\")\n",
    "\n",
    "# # 当前工作目录\n",
    "# import os\n",
    "# os.getcwd()\n",
    "# # C:\\\\Users\\\\Administrator\\\\Desktop\\\\pythonProjec\\\\2203APython\\\\月考题\\\\05"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr_pred = lr_best_mode.predict(X_test)\n",
    "# 转成df\n",
    "lr_res = pd.DataFrame(lr_pred)\n",
    "# 保存模型\n",
    "lr_res.to_csv(\"xxxx.csv\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}